# This function is required by _dpkg and _dpkg-reconfigure -*- shell-script -*-

_have grep-status && {
    _comp_dpkg_installed_packages()
    {
        grep-status -P -e "^${1-}" -a -FStatus 'ok installed' -n -s Package
    }
} || {
    _comp_dpkg_installed_packages()
    {
        command grep -A 1 "Package: ${1-}" /var/lib/dpkg/status 2>/dev/null |
            command grep -B 1 -Ee "ok installed|half-installed|unpacked| \
            half-configured" \
                -Ee "^Essential: yes" |
            awk "/Package: ${1-}/ { print \$2 }" 2>/dev/null
    }
}

_have grep-status && {
    _comp_dpkg_purgeable_packages()
    {
        grep-status -P -e "^${1-}" -a -FStatus 'ok installed' -o -FStatus 'ok config-files' -n -s Package
    }
} || {
    _comp_dpkg_purgeable_packages()
    {
        command grep -A 1 "Package: ${1-}" /var/lib/dpkg/status 2>/dev/null |
            command grep -B 1 -Ee "ok installed|half-installed|unpacked| \
            half-configured|config-files" \
                -Ee "^Essential: yes" |
            awk "/Package: ${1-}/ { print \$2 }" 2>/dev/null
    }
}

# Debian dpkg(1) completion
#
_dpkg()
{
    local cur prev words cword split
    _init_completion -s || return

    local i=$cword

    # find the last option flag
    if [[ $cur != -* ]]; then
        while [[ $prev != -* && $i -ne 1 ]]; do
            prev=${words[--i - 1]}
        done
    fi

    case $prev in
        --install | --unpack | --record-avail | --contents | --info | --fsys-tarfile | \
            --field | --control | --extract | --vextract | --raw-extract | -!(-*)[ciAIfexX])
            _filedir '?(u|d)deb'
            return
            ;;
        --build | --admindir | --instdir | --root | -!(-*)b)
            _filedir -d
            return
            ;;
        --status | --print-avail | --list | -!(-*)[spl])
            COMPREPLY=($(_xfunc apt-cache _apt_cache_packages))
            return
            ;;
        --show | -!(-*)W)
            if [[ $1 == *dpkg-query ]]; then
                COMPREPLY=($(_xfunc apt-cache _apt_cache_packages))
            else
                _filedir '?(u|d)deb'
            fi
            return
            ;;
        --search | -!(-*)S)
            _filedir
            return
            ;;
        --remove | --verify | -!(-*)[rV])
            COMPREPLY=($(_comp_dpkg_installed_packages "$cur"))
            return
            ;;
        --listfiles | --purge | -!(-*)[LP])
            COMPREPLY=($(_comp_dpkg_purgeable_packages "$cur"))
            return
            ;;
        --debug | -!(-*)D)
            COMPREPLY=($(compgen -W 'help' -- "$cur"))
            return
            ;;
        --ignore-depends)
            local packages=$(
                cur=${cur##*,} _xfunc apt-cache _apt_cache_packages
            )
            _comp_delimited , -W '$packages'
            return
            ;;
        --log)
            _filedir log
            return
            ;;
        --path-exclude | --path-include)
            return
            ;;
        --status-logger)
            COMPREPLY=($(compgen -c -- "$cur"))
            return
            ;;
        --verify-format)
            COMPREPLY=($(compgen -W 'rpm' -- "$cur"))
            return
            ;;
    esac

    $split && return

    COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
    for i in ${!COMPREPLY[*]}; do
        # remove ones ending with a dash (known parse issue, hard to fix)
        [[ ${COMPREPLY[i]} != *- ]] || unset -v 'COMPREPLY[i]'
    done
    [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
} &&
    complete -F _dpkg dpkg dpkg-deb dpkg-query

# Debian GNU dpkg-reconfigure(8) completion
#
_dpkg_reconfigure()
{
    local cur prev words cword
    _init_completion || return

    local opt

    case $prev in
        --frontend | -!(-*)f)
            opt=(/usr/share/perl5/Debconf/FrontEnd/*)
            if ((${#opt[@]})); then
                opt=(${opt[@]##*/})
                opt=(${opt[@]%.pm})
                COMPREPLY=($(compgen -W '${opt[@]}' -- "$cur"))
            fi
            return
            ;;
        --priority | -!(-*)p)
            COMPREPLY=($(compgen -W 'low medium high critical' -- "$cur"))
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '--frontend --priority --all --unseen-only
            --help --showold --force --terse' -- "$cur"))
    else
        COMPREPLY=($(_comp_dpkg_installed_packages "$cur"))
    fi
} &&
    complete -F _dpkg_reconfigure -o default dpkg-reconfigure

# ex: filetype=sh
